+2006-09-26 Kristian Rietveld <kris@imendio.com>
+
+ * gtk/gtktreemodelfilter.c (gtk_tree_model_filter_init),
+ (gtk_tree_model_filter_finalize), (gtk_tree_model_filter_row_deleted),
+ (gtk_tree_model_filter_new): unref the virtual root path once that
+ node (or one if its ancestors) is deleted, set virtual_root_deleted
+ so we only unref it once.
+
2006-09-26 Kristian Rietveld <kris@imendio.com>
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_changed),
gboolean modify_func_set;
gboolean in_row_deleted;
+ gboolean virtual_root_deleted;
/* signal ids */
guint changed_id;
filter->priv->visible_method_set = FALSE;
filter->priv->modify_func_set = FALSE;
filter->priv->in_row_deleted = FALSE;
+ filter->priv->virtual_root_deleted = FALSE;
}
static void
{
GtkTreeModelFilter *filter = (GtkTreeModelFilter *) object;
- if (filter->priv->virtual_root)
- gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root);
+ if (filter->priv->virtual_root && !filter->priv->virtual_root_deleted)
+ {
+ gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root);
+ filter->priv->virtual_root_deleted = TRUE;
+ }
gtk_tree_model_filter_set_model (filter, NULL);
GtkTreePath *path;
FilterLevel *level = FILTER_LEVEL (filter->priv->root);
+ gtk_tree_model_filter_unref_path (filter, filter->priv->virtual_root);
+ filter->priv->virtual_root_deleted = TRUE;
+
if (!level)
return;
filter = GTK_TREE_MODEL_FILTER (retval);
if (filter->priv->virtual_root)
- gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root);
+ {
+ gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root);
+ filter->priv->virtual_root_deleted = FALSE;
+ }
return retval;
}